// 04-myPromise-test.js:    myPromise测试

const MyPromise = require('./04-myPromise');
const { resolve } = require('./04-myPromise');

let promise = new MyPromise((resolve, reject) => {
    //*********1.promise添加异步逻辑
    // setTimeout(() => {
    //     resolve('成功...');
    // }, 2000);
    // throw new Error('executor error');
    resolve('成功');
    // reject('失败');
});


//*********2.then方法多次调用，添加多个处理函数

// promise.then(value => {
//     console.log('value111', value);
// }, reason => {
//     console.log('reason111', reason);
// });

// promise.then(value => {
//     console.log('value222', value);
// }, reason => {
//     console.log('reason222', reason);
// });

// promise.then(value => {
//     console.log('value333', value);
// }, reason => {
//     console.log('reason333', reason);
// });


//*********3.then方法的链式调用(then方法返回的是一个promise对象)

// function other() {
//     return new MyPromise((resolve, reject) => {
//         resolve('other');
//     });
// }
// promise.then(value => {
//     console.log(value);
//     return other();
// }).then(value => {
//     console.log(value);
// });


//*********4.then方法链式调用识别Promise对象自返回
// let p1 = promise.then(value => {
//     console.log('value', value);
//     return p1;
// });
// p1.then(value => {
//     console.log(value);
// }, reason => {
//     console.log('reason', reason.message);
// });


//*********5.捕获错误及then链式调用其他状态代码补充
// promise.then(value => {
//     console.log('value', value);
//     throw new Error('then error');
// }, reason => {
//     console.log('reason', reason.message);
// }).then(value=>{
//     console.log('value222',value);
// },reason=>{
//     console.log('reason222',reason.message);
// });


//*********6.将then方法的参数变为可选参数(调用then方法时，then方法可以不传递参数，这个promise状态会一直传递，直到传递给有回调函数then方法)
// promise.then().then().then(value => console.log(value), reason => console.log(reason));


//*********7.Promise.all方法
/**
 * 1.Promise.all允许我们按照异步代码调用的顺序，得到异步代码调用的结果
 * 2.Promise.all方法接收一个数组作为参数，这个数组中的元素可以是任何值，包括普通值和promise对象
 * 3.Promise.all方法执行结果全部成功才返回成功，有一个失败则返回失败
 * 4.Promist.all方法，是一个类的方法，所以一定是个静态方法
 */
// p1 = () => {
//     return new MyPromise((resolve, reject) => {
//         setTimeout(() => {
//             resolve('p1');
//         }, 2000);
//     });
// }
// p2 = () => {
//     return new MyPromise((resolve, reject) => {
//         resolve('p2');
//     });
// }

// MyPromise.all(['a', 'b', p1(), p2(), 'c']).then(result => {
//     console.log('result',result);//result -> ['a','b','p1','p2','c']
// });


//*********8.Promise.resolve()方法
// p1 = () => {
//     return new MyPromise((resolve, reject) => {
//         resolve('hello');
//     });
// }
// MyPromise.resolve(10).then(value => console.log(value))
// MyPromise.resolve(p1()).then(value => console.log(value))


//*********9.Promise.finally()方法
// p1 = () => {
//     return new MyPromise((resolve, reject) => {
//         setTimeout(() => {
//             resolve('p1 resolve');
//         }, 2000);
//     });
// }
// p2 = () => {
//     return new MyPromise((resolve, reject) => {
//         reject('p2 reject');
//     });
// }
// p2().finally(() => {
//     console.log('finally');
//     return p1();
// }).then(value => console.log(value), reason => console.log(reason));


//*********10.Promise.catch()方法
p1 = () => {
    return new Promise((resolve, reject) => reject('p1 reject'));
}
p1()
    .then(value => console.log(value))
    .catch(reason => console.log(reason))


